home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / hexrev / hexrev.c < prev    next >
C/C++ Source or Header  |  2000-06-25  |  5KB  |  234 lines

  1. /***************************************************
  2.  
  3.   hexrev.c : 六角リバーシゲームだよ
  4.  
  5.     Copyright (C) 1997 - 2000 by Makoto Hiroi
  6.  
  7. ****************************************************/
  8. #include    "hexrev.h"
  9.  
  10. int        first_move = TRUE;        /* 人間側が先手(黒) */
  11. int        level = 1;                /* レベル */
  12. int        play_flag;                /* ゲーム中か */
  13.  
  14.  
  15. /* 250 msec wait ルーチン */
  16. void wait( void )
  17. {
  18.     int        start = clock();
  19.     while( (clock() - start) < 25 );
  20. }
  21.  
  22. /* 終了 */
  23. volatile void quit( void )
  24. {
  25.     _iocs_crtmod( 16 );
  26.     _iocs_skey_mod( -1, 0, 0 );    /* ソフトウェアキーボード自動制御 */
  27.     _iocs_ms_curof();
  28.     _dos_c_fnkmod( 0 );
  29.     _dos_c_curon();
  30.     _dos_c_window( 0, 31 );
  31.     exit( 0 );
  32. }
  33.  
  34. /* メッセージ */
  35. typedef enum {
  36.     MOVE_COM, MOVE_HUMAN, BREAK, C_WIN, H_WIN, DRAW, THINK, PASS_M, NOT_PUT,
  37. } MES_CODE;
  38.  
  39. const char *mes_table[] = {
  40.     "わたしの手番です",
  41.     "あなたの手番です",
  42.     "対局を中断します",
  43.     "私の勝ちです  ",
  44.     "あなたの勝ちです",
  45.     "引き分けですね ",
  46.     "考えています・・",
  47.     "・・パスです・・",
  48.     "石は置けませんよ",
  49. };
  50.  
  51. /* メッセージ出力 */
  52. static void print_mes( int pos )
  53. {
  54.     _dos_c_locate( 22, 28 );
  55.     printf( "%s", mes_table[pos] );
  56.     fflush( stdout );
  57.     wait();
  58.     wait();
  59. }
  60.  
  61. /* 石を置く */
  62. static int put_piece( int num, int piece )
  63. {
  64.   char buffer[SIZE];
  65.   char *ptr = buffer;
  66.   int c = reverse_piece( num, piece, buffer );
  67.   if( c > 0 ){
  68.     draw_piece( num, piece );
  69.     wait();
  70.     while( *ptr != -1 ){
  71.       draw_piece( *ptr++, piece );
  72.       wait();
  73.     }
  74.   }
  75.   return c;
  76. }
  77.  
  78. /* マウス入力 */
  79. static int input_mouse( int piece )
  80. {
  81.   for(;;){
  82.     int        pos, x, y;
  83.     while( _iocs_ms_ontm( 0, 0 ) == 0 );    /* 左ボタンが押されるまで待つ */
  84.     pos = _iocs_ms_curgt();
  85.     while( _iocs_ms_offtm( 0, 0 ) == 0 );    /* ボタンが離されるのを待つ */
  86.     x = pos >> 16; y = pos & 0xffff;
  87.     if( (piece < FREE) &&
  88.         (x >= 48 && x < 466) && (y >= 48 && y < 466) ){
  89.       /* 駒を置く */
  90.       int n = get_postion( x, y );
  91.       if( n == -1 || put_piece( n, piece ) <= 0 ){
  92.         /* その場所には置けません */
  93.         print_mes( NOT_PUT );
  94.       } else {
  95.         return n;
  96.       }
  97.     } else if( y >= 480 ){  /* ステータスライン */
  98.       x = x / 64;
  99.       switch( x - 4 ){
  100.       case 0:        /* レベルの変更 */
  101.         if( ++level > 5 ) level = 1;
  102.         print_level();
  103.         break;
  104.       case 1:        /* 先手・後手の変更 */
  105.         if( play_flag == FALSE ){
  106.           first_move = (first_move ? FALSE : TRUE);
  107.           print_move();
  108.         }
  109.         break;
  110.       case 2:        /* 対局 */
  111.         return START;
  112.       case 3:        /* 終了 */
  113.         quit(); break;
  114.       }
  115.     }
  116.   }
  117. }
  118.  
  119.  
  120. /* ゲームの実行 */
  121. static void play( void )
  122. {
  123.   int    turn, move, human_piece, com_piece, value;
  124.   if( first_move ){
  125.     turn = HUMAN;
  126.     human_piece = BLACK; com_piece = WHITE;
  127.   } else {
  128.     turn = COM;
  129.     human_piece = WHITE; com_piece = BLACK;
  130.   }
  131.   for(;;){
  132.     if( turn == HUMAN ){
  133.       /* 人間側の指し手 */
  134.       print_mes( MOVE_HUMAN );
  135.       if( !check_move( human_piece ) ){
  136.         if( check_move( com_piece ) ){
  137.           /* パスです */
  138.           print_mes( PASS_M );
  139.         } else {
  140.           /* 終了です */
  141.           value = result_value( TRUE );
  142.           break;
  143.         }
  144.       } else {
  145.         if( (move = input_mouse( human_piece )) == START ){
  146.           /* 中断です */
  147.           print_mes( BREAK );
  148.           value = NO_VALUE;
  149.           break;
  150.         }
  151.       }
  152.       turn = COM;
  153.  
  154. #ifdef 0
  155.       if( (move = select_move( human_piece, level )) == PASS ){
  156.         if( check_move( com_piece ) ){
  157.           /* パスだよ */
  158.           print_mes( PASS_M );
  159.         } else {
  160.           /* 終了です */
  161.           value = result_value( TRUE );
  162.           break;
  163.         }
  164.       } else {
  165.         put_piece( move, human_piece );  /* 駒を置くよ */
  166.       }
  167.       turn = COM;
  168. #endif
  169.  
  170.     } else {
  171.       /* コンピュータ側の指し手 */
  172.       print_mes( MOVE_COM );
  173.       if( (move = select_move( com_piece, level )) == PASS ){
  174.         if( check_move( human_piece ) ){
  175.           /* パスだよ */
  176.           print_mes( PASS_M );
  177.         } else {
  178.           /* 終了です */
  179.           value = result_value( TRUE );
  180.           break;
  181.         }
  182.       } else {
  183.         put_piece( move, com_piece );    /* 駒を置くよ */
  184.       }
  185.       turn = HUMAN;
  186.     }
  187.     print_stones();
  188.     /* 終了判定 */
  189.     if( (value = result_value( FALSE )) != NO_VALUE ){
  190.       break;        /* 終了です */
  191.     }
  192.   }
  193.   if( value != NO_VALUE ){
  194.     if( value == 0 ){
  195.       print_mes( DRAW );
  196.     } else if( value > 0 ){
  197.       /* 黒の勝ち */
  198.       print_mes( (human_piece == BLACK ? H_WIN : C_WIN) );
  199.     } else {
  200.       /* 白の勝ち */
  201.       print_mes( (human_piece == WHITE ? H_WIN : C_WIN) );
  202.     }
  203.   }
  204. }
  205.  
  206. /* 初期化 */
  207. static void init_rev( void )
  208. {
  209.     srand( time( NULL ) );    /* 乱数の初期化 */
  210.     init_screen();            /* 画面の初期化 */
  211.     init_data();            /* データの初期化 */
  212.     _dos_c_cls_al();
  213. }
  214.  
  215.  
  216. /* メインルーチン */
  217. int main( int argc, char *argv[] )
  218. {
  219.     init_rev();
  220.     for(;;){
  221.         /* 対局が押されるまで待つ */
  222.         while( input_mouse( FREE ) != START );
  223.         init_data();
  224.         play_flag = TRUE;
  225.         play();                    /* ゲームの実行 */
  226.         play_flag = FALSE;
  227.     }
  228.     /* 終了は quit で行う */
  229.     return 0;
  230. }
  231.  
  232. /* end of file */
  233.  
  234.